package com.example.ggmusic;

import android.content.Context;
import android.database.Cursor;
import android.provider.MediaStore;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.TextView;

/*
 * 管理音乐库的CursorAdapter，将音乐库的每一条数据适配到ListView的一个列表项上。
 * 在每次需要显示新的列表项时，newView方法会创建一个新的视图并缓存对列表项中控件的引用，
 * 然后在bindView方法中将光标中的数据绑定到对应的控件上。
*/
public class MediaCursorAdapter extends CursorAdapter {

    // 声明一个私有Context类型的成员变量mContext，它用于获取当前上下文环境
    private final Context mContext;

    // 声明一个私有LayoutInflater类型的成员变量mLayoutInflater，它用于从XML资源文件中创建视图  
    private final LayoutInflater mLayoutInflater;

    public MediaCursorAdapter(Context context) {
        // 调用父类CursorAdapter的构造函数，初始化基础CursorAdapter
        super(context, null, 0);
        // 将传入的上下文赋值给mContext成员变量 
        mContext = context;
        // 使用mContext创建LayoutInflater实例，并赋值给mLayoutInflater成员变量  
        mLayoutInflater = LayoutInflater.from(mContext);
    }

    // 定义一个静态内部类ViewHolder，它用于存储界面的控件引用，提高findViewById效率
    public static class ViewHolder {
        TextView tvTitle;
        TextView tvArtist;  
        TextView tvOrder;
        // 定义一个View类型的成员变量divider，它可能用于表示列表项的分隔线
        View divider;
    }

    // 用于创建一个新的视图并返回
    @Override
    public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
         // 使用mLayoutInflater通过R.layout.list_item布局文件创建视图并赋值给view变量  
        // 第三个参数为true表示将视图直接添加到viewGroup中  
        View view = mLayoutInflater.inflate(R.layout.list_item, viewGroup, false);
        if (view != null) {
            ViewHolder viewHolder = new ViewHolder();
            viewHolder.tvTitle = view.findViewById(R.id.tv_title);
            viewHolder.tvArtist = view.findViewById(R.id.tv_artist);
            viewHolder.tvOrder = view.findViewById(R.id.tv_order);
            viewHolder.divider = view.findViewById(R.id.divider);
            view.setTag(viewHolder); // 将ViewHolder实例设置为视图的Tag属性，便于后续通过这个视图找到ViewHolder实例
            return view;
        }
        return null;
    }

    // 用于将数据绑定到视图上 
    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        ViewHolder viewHolder = (ViewHolder) view.getTag(); // 从视图中通过Tag属性获取到ViewHolder实例  

        // 从光标中获取标题和艺术家对应的列索引  
        int titleIndex = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
        int artistIndex = cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);

        // 从光标中获取标题和艺术家对应的值
        String title = cursor.getString(titleIndex);
        String artist = cursor.getString(artistIndex);

        // 获取当前光标的位置
        int position = cursor.getPosition();

        if (viewHolder != null) {
            // 将获取到的标题、艺术家和位置信息分别设置到对应的TextView
            viewHolder.tvTitle.setText(title);
            viewHolder.tvArtist.setText(artist);
            viewHolder.tvOrder.setText(Integer.toString(position + 1));
        }
    }
}